import {
  fetchUser,
  fetchItems,
  fetchIdsByType
} from '../api'
// 这部分api蛮有意思的，是基于google的firebase服务的一些API

export default {
  // ensure data for rendering given list type
  FETCH_LIST_DATA: ({ commit, dispatch, state }, { type }) => {
    commit('SET_ACTIVE_TYPE', { type })
    return fetchIdsByType(type)
      // 这里的ids是纯id列表，后续使用activiteIds(一个getters)去获取对应的items的数据
      .then(ids => commit('SET_LIST', { type, ids })) // 设置当前type的id列表(成百上千个id)
      // 设置完该type的id列表后，activeIds（getters）依赖各个类型的列表数据，所以会根据
      // 当前itemsPerPage（页码）/ activeType(活跃类型) / lists[activeType]去把活跃的
      // id列表切片，然后下一轮微任务执行的时候给根据活跃的id列表，
      // 即根据这个切片后的id列表去获取真实需要渲染到界面上的items的列表
      .then(() => dispatch('ENSURE_ACTIVE_ITEMS'))
  },

  // ensure all active items are fetched
  ENSURE_ACTIVE_ITEMS: ({ dispatch, getters }) => {
    return dispatch('FETCH_ITEMS', {
      ids: getters.activeIds
    })
  },

  FETCH_ITEMS: ({ commit, state }, { ids }) => { // ids即getters.activeIds，活跃的id列表
    // on the client, the store itself serves as a cache.
    // only fetch items that we do not already have, or has expired (3 minutes)
    const now = Date.now()
    ids = ids.filter(id => {
      const item = state.items[id] // 看是否已经存在对应id的item
      if (!item) {
        return true // 如果没有，就返回true，表示后续需要获取该id的item
      }
      // 如果有，就看是否过期，过期了就返回true，表示后续需要获取该id的item
      if (now - item.__lastUpdated > 1000 * 60 * 3) { 
      // if (now - item.__lastUpdated > 1000 * 5) {
        return true
      }
      return false
    })
    if (ids.length) { // 获取所有未存在或者已过期的活跃id的item并设置到state.items中
      return fetchItems(ids).then(items => commit('SET_ITEMS', { items }))
    } else {
      return Promise.resolve()
    }
  },

  FETCH_USER: ({ commit, state }, { id }) => {
    return state.users[id]
      ? Promise.resolve(state.users[id])
      : fetchUser(id).then(user => commit('SET_USER', { id, user }))
  }
}
